package qc.module.cms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.module.cms.entity.MonitorData;
import qc.module.cms.repository.MonitorDataRepository;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * MonitorDataService
 *
 * @author QuCheng Tech
 * @since 2023/12/20
 */
@Service
public class MonitorDataService {
    private MonitorDataRepository repository;

    @Autowired
    public void setMonitorDataRepository(MonitorDataRepository repository) {
        this.repository = repository;
    }

    /**
     * 根据指定的查询条件查询数据，查询条件必须指定并且要求正确
     *
     * @param stcd       站号
     * @param datatype   数据类型
     * @param beginTime  起始时间，包含该时间点
     * @param endTime    截止时间，包含该时间点
     * @param descByTime 结果是否按时间降序排列
     * @return java.util.HashMap<java.util.Date, java.lang.Double>
     * @author QuCheng Tech
     * @since 2023/12/20
     */
    public Map<Date, Double> getMonitorDatas(String stcd, String datatype, Date beginTime, Date endTime, Boolean descByTime) {
        //判断查询条件是否正确：站号和数据类型不能为空，起始时间不能小于截止时间
        if (!StringUtils.isBlank(stcd) && !StringUtils.isBlank(datatype) && !beginTime.after(endTime)) {
            //查询数据
            LambdaQueryWrapper<MonitorData> wrapper = new LambdaQueryWrapper<>();
            //查询时间和数据值列，其他列不查询
            wrapper.select(MonitorData::getTm, MonitorData::getValue);
            //查询条件
            wrapper.eq(MonitorData::getStcd, stcd);
            wrapper.eq(MonitorData::getDatatype, datatype);
            wrapper.ge(MonitorData::getTm, beginTime);
            wrapper.le(MonitorData::getTm, endTime);
            //排序
            if (descByTime)
                wrapper.orderByDesc(MonitorData::getTm);
            else
                wrapper.orderByAsc(MonitorData::getTm);

            List<MonitorData> ens = repository.selectList(wrapper);
            if (ens != null && ens.size() > 0x0) {
                return ens.stream().collect(Collectors.toMap(MonitorData::getTm, MonitorData::getValue));
            }
        }

        return null;
    }
}
